﻿Imports System.Threading
Imports System.ServiceProcess
Imports System.Net

Public Class Main
    'Creamos un Thread o subproceso para que la interfaz se vea mas bonita
    'Si no lo hacemos con subproceso, no se alcansa a ver lo que esta procesando, por eso lo hacemos con un subproceso
    'Creamos una nueva instancia de subproceso "hilo" que tendra una función por defecto que se llama "comprobarServicios" 
    Dim hilo As New Thread(AddressOf comprobarServicios)
    'Declaramos una variable booleana para detener el progressBar
    Dim sw As Boolean = False
    Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Iniciamos el hilo o subproceso
        hilo.Start()
        'Iniciamos el timer que verifica la variable "SW" para que detenga el progresBar
        Timer1.Start()
        'Mientras se cargan los servicios deshabilitamos los botones
        Button1.Enabled = False
        Button2.Enabled = False
        areaTrans.Visible = False
    End Sub
    'Para manejar la interfaz desde el subproceso, instanciamos subprocesos de delegado
    'Son basicamente subprocesos para manejar la interfaz y acceder a variables de control
    Public Delegate Sub CloseFormDelegate(ByVal cForm As Form)
    Public Delegate Sub SetControlTextDelegate(ByVal aControl As Control, ByVal text As String)
    Public Sub controlTexto(ByVal aControl As Control, ByVal texto As String)
        'la UI tiene que invocar al delegado
        'la primera vez lo debe invocar
        If Label2.InvokeRequired Then
            'se crea un delegado  haciendo llamado a la misma función recursiva
            Dim delegado As New SetControlTextDelegate(AddressOf controlTexto)
            'se invoca en el label el delegado con parametros 
            Label2.Invoke(delegado, New Object() {aControl, texto})
        Else
            aControl.Text = texto
        End If
    End Sub
    'subproceso para cerrar los form, esto se aplica cuando se cierra la interfas, o si no todavia queda en memoria
    Public Sub closeForm(ByVal c_form As Form)
        If Me.InvokeRequired Then
            Dim delegado As New CloseFormDelegate(AddressOf closeForm)
            Me.Invoke(delegado, c_form)
        Else
            Me.Close()
        End If
    End Sub
    Public Sub comprobarServicios()
        Try
            'manejamos la interfas desde el subproceso (thread) a través del subproceso controlTexto
            controlTexto(Label4, "Comprobando Conexión a Internet")
            'Detenemos 2 segundos para que se pueda visualizar lo que esta procesando
            Thread.Sleep(2000)
            'llamamos la funcion comrpobarConexion que esta en el módulo "Funciones"
            If comprobarConexion() Then
                'guardamos el estdo del internet en la variable on_line
                is_online = True
                'Cambiamos la imagen en la interfas por un visto bueno (ok.png)
                'la imagen es parte de los recursos de la aplicacion, por eso "my.resourse.ok"
                PictureBox4.Image = My.Resources.ok
                controlTexto(Label5, "Conexión Satisfactoria")
                controlTexto(Label4, "Buscando Navegador Google Chrome")
                'LLamamos la función para buscar el archivo google Chrome, ubicado en "Funciones"
                If archivoChrome() Then
                    chrome = True
                    Thread.Sleep(2000)
                    PictureBox5.Image = My.Resources.ok
                    controlTexto(Label6, "Navegador Chrome Instalado")
                Else
                    controlTexto(Label6, "Navegador no encontrado")
                End If

                'Verificamos apache ara poder compartir y levantar servidor!
                Try
                    controlTexto(Label4, "Preparando Servicios para Compartir")
                    Thread.Sleep(2000)
                    'Para manejar procesos creamos una instancia de ServiceController llamado "proceso"
                    'el proceso que yo le mandé por parámetro es wampapache, los procesos o servicios los pueden ver en servicios de sistema
                    'le pueden mandar por parámetro cualquier servicio o proceso y hacerlo correr o detenerlo
                    Dim proceso As New ServiceController("wampapache")
                    'si lo encontramos , guardamos en una variable booleana
                    apache = True
                    'si el servicio esta corriendo y ok
                    If ServiceControllerStatus.Running Then
                        PictureBox6.Image = My.Resources.ok
                    Else
                        'si no, lo iniciamos
                        proceso.Start()
                    End If
                    controlTexto(Label7, "Servicios listos para compartir")
                Catch ex As Exception
                    'si no lo encontramos, nos mandará una excepción
                    controlTexto(Label7, "Servicios no encontrados")
                End Try
            Else
                controlTexto(Label5, "Favor verificar conexión")
            End If
            controlTexto(Label4, " ")
            controlTexto(Label3, "Todo Listo!")
            'guardamos en la variable sw que el proceso termino
            sw = True
            'detenemos el hilo
            hilo.Abort()
        Catch ex As Exception
            'MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'si el hilo se detubo
        If sw Then
            'detenemos el progresbar, cambiando el estilo y la animación
            ProgressBar1.Style = ProgressBarStyle.Continuous
            ProgressBar1.MarqueeAnimationSpeed = 100
            'detenemos el timer y liberamos memoria
            Button1.Enabled = True
            Button2.Enabled = True
            Timer1.Stop()
            Timer1.Dispose()
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If is_online And chrome And apache Then
            areaTrans.Visible = True
        Else
            'FORM Microsoft
        End If
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Ingresoip.Show()
        Me.Hide()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        
        fApuntes.Label4.Text = "Tu Dirección IP es: " & GetLocalIP()
        Process.Start("C:\Program Files\Google\Chrome\Application\chrome.exe", "http://localhost/BookWeb/Servidor/")
        fApuntes.Show()
        Me.Hide()

    End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Agenda.Show()

    End Sub
End Class
